/**
 * 路由配置
 * @file Vue Router配置文件
 */
import { createRouter, createWebHistory } from 'vue-router'
import { useUserStore } from '@/stores/user'
import { useRouteStore } from '@/stores/route'
import { storeToRefs } from 'pinia'

// 导入 Pinia 存储实例 (确保 pinia 已经在 main.js 中创建并安装)
// import { pinia } from '@/stores'; // 如果你在 stores/index.js 或 main.js 中导出了 pinia 实例

// 基础路由 - 通常是不需要登录即可访问的页面
// 将动态路由（如首页 '/' 及其子路由）和 component-based 的 catch-all 路由从中移除
const constantRoutes = [
  {
    path: '/login',
    name: 'login',
    component: () => import('@/views/login.vue'),
    meta: {
      title: '登录',
      requiresAuth: false, // 登录页不需要登录
    },
  },
  // 静态的 404 页面路由 - 任何人都可以直接访问 /404
  {
    path: '/404',
    name: 'StaticNotFound', // 给一个独特的名称，区别于动态添加的 catch-all
    component: () => import('@/views/404.vue'),
    meta: {
      title: '页面不存在',
      requiresAuth: false, // 404 页面通常不需要登录
    },
  },
]

// 创建路由实例
const router = createRouter({
  history: createWebHistory(),
  routes: constantRoutes, // 初始只加载基础路由 (登录页, 静态404页)
})

// 白名单路径，不需要登录即可访问
// 这里的白名单主要用于 beforeEach 守卫中判断是否需要强制用户登录
const whiteList = ['/login', '/404']

// 路由守卫
router.beforeEach(async (to, from, next) => {
  // 在守卫中使用 store，确保 pinia 已安装
  const userStore = useUserStore()
  const { isLogin } = storeToRefs(userStore)
  const routeStore = useRouteStore()

  // 设置页面标题 - 根据当前路由的 meta 信息
  document.title = to.meta.title ? `${to.meta.title} - 选课系统` : '选课系统'

  // 检查是否在白名单内
  if (whiteList.includes(to.path)) {
    // 如果已登录且访问登录页，重定向到首页
    if (to.path === '/login' && isLogin.value) {
      // 尝试导航到 Home 命名路由，或者根路径
      const homeRouteExists = router.hasRoute('Home')
      if (homeRouteExists) {
        next({ name: 'Home' }) // 使用命名路由导航
      } else {
        // 如果 Home 路由还不存在 (动态路由未加载)，导航到根路径
        // 根路径的路由 (path: '/') 将在动态路由中加载，并可能带有 redirect: '/home'
        next({ path: '/' })
      }
    } else {
      // 在白名单内，且不是已登录访问登录页，直接放行
      next()
    }
    return // 中断后续逻辑
  }

  // 非白名单路径，需要检查登录状态
  if (isLogin.value) {
    // 用户已登录
    if (!routeStore.hasAddRoutes) {
      // 用户已登录，但动态路由尚未加载
      const loadSuccess = await routeStore.loadDynamicRoutes()

      if (loadSuccess) {
        // 重要：使用 next({...to, replace: true}) 重新触发当前导航
        // 这样 Vue Router 会再次尝试匹配目标路径 (to.fullPath)，这次就能找到刚刚添加的动态路由
        next({ path: to.fullPath, replace: true })
      } else {
        // 动态路由加载失败 (例如后端接口错误或解析失败)
        console.error('[Router Guard] Failed to load dynamic routes.')
        // 清除用户登录状态，并重定向到登录页
        userStore.clearUserInfo() // 确保登录状态被清除
        // 重定向到登录页，并带上 redirect 查询参数，登录成功后可以跳回原目标页
        next({ path: '/login', query: { redirect: to.fullPath } })
      }
    } else {
      // 用户已登录，且动态路由已加载
      // 此时，所有静态和动态路由都已经存在于 router 实例中
      // Vue Router 会自己尝试匹配 `to.path`
      // 如果匹配到了，就会正常导航；如果没匹配到，会匹配到我们动态添加的 `/:pathMatch(.*)*` 路由
      // 可以在这里增加更细粒度的权限检查，例如根据 `to.meta.roles` 和用户的实际角色进行判断
      // if (to.meta && to.meta.requiresAuth && !userStore.hasPermission(to.meta.roles)) {
      //    next('/403'); // 如果你有一个无权限页面
      // } else {
      console.log('[Router Guard] Dynamic routes already added. Proceeding.')
      next() // 放行
      // }
    }
  } else {
    // 用户未登录且访问非白名单路径，强制重定向到登录页
    console.log(
      `[Router Guard] User not logged in. Redirecting ${to.fullPath} to /login.`
    )
    next({ path: '/login', query: { redirect: to.fullPath } })
  }
})

export default router
